#define _GNU_SOURCE
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

/*不定参宏函数*/
#define LOG(fmt, ...) printf("[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)

/*C风格的不定参函数*/
void PrintNum(int n, ...)
{
    va_list ap;
    va_start(ap, n); // 让ap指向n参数之后的第一个可变参数
    for (int i = 0; i < n; i++)
    {
        int num = va_arg(ap, int); // 从可变参数中提取一个整型参数
        printf("%d\n", num);
    }
    va_end(ap); // 清空可变参数列表--将ap置空
}

void myPrintf(const char *fmt, ...)
{
    char *res;
    va_list ap;
    va_start(ap, fmt);
    /*根据格式化字符串动态申请内存，并将结果装进res中*/
    int len = vasprintf(&res, fmt, ap);
    va_end(ap);
    printf("%s\n", res);
    free(res); // 用完记得释放，否则会内存泄漏
}
int main()
{
    LOG("李四");
    LOG("%s-%s", "张三", "18");

    PrintNum(3, 11, 22, 33);
    printf("\n");
    PrintNum(5, 44, 55, 66, 77, 88);

    myPrintf("%s-%d", "张三", 18);
    myPrintf("%s-%s-%d", "李四", "学生", 22);
    myPrintf("%s-%f", "苹果", 1.9);
    myPrintf("%s-%f-%d", "香蕉", 2.2, 200);

    return 0;
}